/* read/write from popen */
/*popenexam.c*/
#include<stdlib.h>
#include<stdio.h>
#include <string.h>

void main() {
    // 定义两个文件指针，分别用于读取和写入管道
    FILE *readfp, *writefp;
    // 定义一个缓冲区，用于存储从管道读取的数据
    char buf[100];

    // 使用 popen 函数以只读模式打开一个管道，执行 "ps aux" 命令
    // "ps aux" 命令用于显示当前系统中所有进程的详细信息
    // r 表示读取模式，即从该命令的输出中读取数据
    readfp = popen("ps aux", "r");

    // 使用 popen 函数以只写模式打开一个管道，执行 "grep init" 命令
    // "grep init" 命令用于在输入数据中查找包含 "init" 的行
    // w 表示写入模式，即将数据写入该命令的输入
    writefp = popen("grep init", "w");

    // 循环从 readfp 指向的管道中读取数据，每次最多读取 99 个字符
    // fgets 函数会一直读取，直到遇到换行符或文件结束符
    // 当读取到文件结束符时，fgets 函数返回 NULL，循环结束
    while (fgets(buf, 99, readfp) != NULL) {
        // 将从 readfp 读取的数据写入 writefp 指向的管道
        fputs(buf, writefp);
    }

    // 关闭 readfp 指向的管道
    // pclose 函数会等待子进程结束，并返回其退出状态
    pclose(readfp);
    // 关闭 writefp 指向的管道
    pclose(writefp);
}